# -*- coding: utf-8 -*-


import sys
from PySide6.QtWidgets import *
from PySide6.QtGui import Qt
from PySide6.QtCore import QDate
from PySide6.QtSql import  QSqlQuery
from PySide6.QtCore import Signal, QFile, QIODevice
import os


class SaveItemFormClass(QDialog):
    """
    初始化ItemForm对话框。

    Args:
        parent (QWidget, optional): 父窗口对象。默认为None。

    Returns:
        无返回值，初始化对话框并设置其布局和控件。

    """
    def __init__(self, parent=None):
        super(SaveItemFormClass, self).__init__(parent)
        
        #设置默认id
        self.id = "1"
        #设置默认文件路径
        self.fileName = ""
              
        #设置窗口大小
        self.resize(320, 400)
        
        #对话框类型
        self.itemType = ""
        
        #设置和初始化收文时间
        self.date = QDateTimeEdit(QDate.currentDate(), self)
        self.date.setCalendarPopup(True)
        self.date.setDisplayFormat("yyyy-MM-dd")
        self.date.setFixedWidth(134)  # 设置固定宽度为134像素
        
        #设置其他字段
        self.file_id = QLineEdit()
        self.year = QLineEdit()
        self.term = QLineEdit()
        self.title = QLineEdit()
        self.box_id = QLineEdit()
        self.page = QLineEdit()
        self.file_type = QLineEdit()
        self.government_unit = QLineEdit()
        self.file_number = QLineEdit()
        self.src = QLineEdit()
        
        # 设置文件路径标签：创建一个QToolButton来模仿标签，并设置其样式
        self.fileLabelButton = QToolButton(self)
        self.fileLabelButton.setText("&文件路径:")
        self.fileLabelButton.clicked.connect(self.file_pic_filter)
        
        # 创建按钮
        self.confirmButton = QPushButton('确认')
        self.cancelButton = QPushButton('取消')

        #id,file_id,year,term,title,box_id,page,file_type,government_unit,date,file_number,src = itemObj.values()
        formLayout = QFormLayout()
        formLayout.addItem(QSpacerItem(10,10))

        formLayout.addRow("&件      号:", self.file_id)
        formLayout.addRow("&归档年度:", self.year)
        formLayout.addRow("&保管期限:", self.term)
        formLayout.addRow("&文件题名:", self.title)
        formLayout.addRow("&盒      号:", self.box_id)
        formLayout.addRow("&页      数:", self.page)
        formLayout.addRow("&文件类型:", self.file_type)
        formLayout.addRow("& 责 任 者:", self.government_unit)
        formLayout.addRow("&文件时间:", self.date)
        formLayout.addRow("&文件编号:", self.file_number)
        formLayout.addRow(self.fileLabelButton, self.src)
        formLayout.addItem(QSpacerItem(10,10))
        formLayout.addRow(self.confirmButton,self.cancelButton)
         
        # 模拟macStyle表单布局外观，但使用左对齐的标签
        formLayout.setRowWrapPolicy(QFormLayout.DontWrapRows)
        formLayout.setFieldGrowthPolicy(QFormLayout.FieldsStayAtSizeHint)
        formLayout.setFormAlignment(Qt.AlignHCenter | Qt.AlignTop)
        formLayout.setLabelAlignment(Qt.AlignLeft)
        formLayout.setSpacing(20)  # 设置布局中的间距为20像素
        
        self.setLayout(formLayout)
       
        # 连接按钮的点击信号到槽函数
        #确认
        self.confirmButton.clicked.connect(self.accept) # accept是QDialog的内置槽函数，用于关闭对话框
        #关闭
        self.cancelButton.clicked.connect(self.reject)  # reject是QDialog的内置槽函数，用于关闭对话框
    """
    设置 QDialog 的标题。

    Args:
        title (str): 对话框的标题文本。

    Returns:
        None: 此方法没有返回值，但会修改当前 QDialog 实例的标题。

    """
    def ItemQDialogTitle(self,title):
        self.setWindowTitle(title)
    """
    设置对象的属性。

    Args:
        obj (dict, optional): 包含要设置的属性的字典。默认为空字典。

    Returns:
        None: 该函数不返回任何值，但会更新对象的属性。

    """
    def setItems(self,obj={}):
        # 将字符串转换为 QDate 对象
        date_string = obj.get("date")
        date_format = "yyyy-MM-dd"  # 与您的日期字符串格式相匹配
        new_date = QDate.fromString(date_string, date_format)
        self.id = (obj.get("id"))        
        self.date.setDate(new_date)
        self.file_id.setText(obj.get("file_id"))
        self.title.setText(obj.get("title"))
        self.file_number.setText(obj.get("file_number"))
        self.file_type.setText(obj.get("file_type"))
        self.government_unit.setText(obj.get("government_unit"))
    
    def setSaveItems(self,obj={}):
        date_string = obj.get("date")
        date_format = "yyyy-MM-dd"  # 与您的日期字符串格式相匹配
        new_date = QDate.fromString(date_string, date_format)
        
        self.id = (obj.get("id"))
        self.file_id.setText(obj.get("file_id"))
        self.year.setText(obj.get("year"))
        self.term.setText(obj.get("term"))
        self.title.setText(obj.get("title"))
        self.box_id.setText(obj.get("year"))
        self.page.setText(obj.get("page"))
        self.file_type.setText(obj.get("file_type"))
        self.government_unit.setText(obj.get("government_unit"))
        self.date.setDate(new_date)
        self.file_number.setText(obj.get("file_number"))
        self.src.setText(obj.get("src"))
        
        """
    获取对象的属性值并返回为字典形式。

    Args:
        无参数。

    Returns:
        dict: 包含对象属性值的字典，包含以下键：
            - id (str): 对象的id值
            - file_id (str): 对象的file_id属性值（文本形式）
            - year (str): 对象的year属性值（文本形式）
            - term (str): 对象的term属性值（文本形式）
            - title (str): 对象的title属性值（文本形式）
            - box_id (str): 对象的box_id属性值（文本形式）
            - page (str): 对象的page属性值（文本形式）
            - file_type (str): 对象的file_type属性值（文本形式）
            - government_unit (str): 对象的government_unit属性值（文本形式）
            - date (str): 对象的date属性值（文本形式）
            - file_number (str): 对象的file_number属性值（文本形式）
            - src (str): 对象的src属性值（文本形式）

    """            
    def getItems(self):
        obj = {
            "id" : self.id,
            "file_id" : self.file_id.text(),
            "year" : self.year.text(),
            "term" : self.term.text(),
            "title" : self.title.text(),
            "box_id" : self.box_id.text(),
            "page" : self.page.text(),
            "file_type" : self.file_type.text(),
            "government_unit" : self.government_unit.text(),
            "date" : self.date.text(),
            "file_number" : self.file_number.text(),
            "src" : self.src.text()
        }
        return obj
    """
    用于过滤文件并返回过滤后的图片文件名，同时将文件名显示在界面上。

    Args:
        无参数。

    Returns:
        无返回值，但会更新self.src的文本内容，显示过滤后的图片文件路径。

    """
    def file_pic_filter(self):
        
        # 使用QFileDialog打开文件对话框
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        self.fileName, _ = QFileDialog.getOpenFileName(self, "选择文件", "",
                                                 "All Files (*);;Text Files (*.txt)", options=options)
        
        target_dir = "."
        basename = os.path.basename(self.fileName)
        makePath = os.path.join(target_dir,"savefile",self.date.text()+os.path.splitext(basename)[0])
        os.makedirs(makePath, exist_ok=True)

        target_file = os.path.join(makePath,basename)
        self.src.setText(target_file)
    """
    复制文件到目标路径。

    Args:
        无（该函数依赖于类的成员变量self.fileName和self.src）

    Returns:
        无返回值，但执行文件复制操作。

    Raises:
        无异常直接抛出，但文件操作可能会抛出QFile相关异常（如文件不存在、无法打开等）。

    """    
    def copy_file(self):
        if self.fileName=="":
            return
        fileName = self.fileName
        target_file = self.src.text()
        # 使用QFile和QFileDevice进行文件复制
        source_file = QFile(fileName)
        target_file_obj = QFile(target_file)

        if source_file.open(QIODevice.ReadOnly) and target_file_obj.open(QIODevice.WriteOnly):
            data = source_file.readAll()
            target_file_obj.write(data)

        source_file.close()
        target_file_obj.close()
               
if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = SaveItemFormClass()
    form.ItemQDialogTitle("新增数据")
    obj = {
        "id":"12",
        "file_id":"0025",
        "date":"2024-07-04",
        "title":"dsds",
        "file_number":"dsd",
        "file_type":"dsd",
        "government_unit":"sdsd",
        "file":"dsdsd",
        "src":"sdsdsdsd"
    }
    form.setItems(obj)
    print(form.getItems())
    form.show()

    sys.exit(app.exec())